﻿/**
 * FansUnion-JS-Array1.0
 *
 * QQ: 240370818
 * Email: LeiWen@FansUnion.cn,zhaoshaolongjj@163.com
 * Date:2013.12.10
 * Copyright 2013-2014, leiwen,zhaoshaolong
 */
 
/**
 *数组排序工具类
 *
 */
var ArrayUtil = (function(win, dom) {
	var ArrayUtil = win.ArrayUtil || {};
	
	//数组的sort方法 可以有参数
	//判断对象是否为数组，可以有多种方法
	
	/**
	*对数组进行排序
	*array:数组
	*order:排序字符串,"asc"或"desc"
	*sortType:排序类型，int,string,character,float,date,object
	*/
	ArrayUtil.sort = function(array, orderStr, sortType) {
		var order = ArrayUtil.order(orderStr);
		if(Function !== sortType.constructor){
			sortType = this.sortType[sortType] || this.sortType.string;
		}
		array.sort(sortType(order));
	};
	
	/**
	*对对象数组进行排序
	*array:数组
	*attribute:数组元素的属性
	*order:排序字符串,"asc"或"desc"
	*sortType:排序类型，int,string,character,float,date,object
	*/
	ArrayUtil.sortObject = function(array, attribute, orderStr, sortType) {
		var order = ArrayUtil.order(orderStr);
		array.sort(ArrayUtil.sortType['object'](order)(attribute, sortType));
	};
	
	// /desc/i 是正则,orderStr应该是"desc"或"asc"
	//RegExp("desc","i");
	/**
	*将一个表示排序的字符串“desc”,转换成-1或1。
	*如果这个字符串包含"desc"，就表示是降序排序，返回-1，否则，表示升序排序，返回1。
	*/
	ArrayUtil.order = function(orderStr){
	  var order = /desc/i.test(orderStr) ? -1 : 1;
	  return order;
	};
	
	//判断一个对象是否为数组
	//龙哥说这是一种比较“保险”的方法，还有其它2种方法
	ArrayUtil.isArray = function(array){
	    //if(array instanceof Array)
		//if(array.constructor === Array)
		return Object.prototype.toString.call(array) === '[object Array]';
	};
	ArrayUtil.sum = function(array, trim){
		if(this.isArray(array)){
			
		}
	};
	
	//排序的类型
	ArrayUtil.sortType = {
	    //int排序-比较函数
		'int' : function(order) {
			return function(str1, str2){
				return order * (parseInt(str1) - parseInt(str2));
			};
		},
		//float排序-比较函数
		'float' : function(order) {
			return function(str1, str2){
				return order * (parseFloat(str1) - parseFloat(str2));
			};
		},
		
		 //new Date("month dd,yyyy hh:mm:ss");
         //new Date("month dd,yyyy");
         //new Date(yyyy,mth,dd,hh,mm,ss);
         //new Date(yyyy,mth,dd);
         //new Date(ms);
   
		//date排序-比较函数
		'date' : function(order) {
			return function(date1, date2){
				return order * (date1 - date2);
			};
		},
		//date排序-比较函数
		'dateStr' : function(order) {
			return function(str1, str2){
				return order * (new Date(str1) - new Date(str2));
			};
		},
		//character排序-比较函数
		'character' : function(order) {
			return function(str1, str2){
			    //本地比较
				return str1.localeCompare(str2);
			};
		},
		//string排序-比较函数
		'string' : function(order) {
			return function(str1, str2){
				var compare;
				if(str1 > str2){
					compare = 1;
				}else if(str1 < str2){
					compare = -1;
				}else{
					compare = 0;
				}
				return compare * order;
			};
		},
		//根据object的属性排序-比较函数
		'object' : function(order) {
			return function(attribute, sortType){
				return function(o1, o2) {
					return ArrayUtil.sortType[sortType || this.string](order)(o1[attribute], o2[attribute]);
				};
			};
		}
	};
	
	return ArrayUtil;
})(window, document);